//
//  JSSComposeView.swift
//  WeiBoItem
//
//  Created by jss on 16/4/25.
//  Copyright © 2016年 jss. All rights reserved.
//

import UIKit
import SnapKit
import pop

class JSSComposeView: UIView {
    
    //当前视图添加到的控制器
    var target:UIViewController?
    
    //取到模型数组
      lazy var array:[JSSComposeListModel] = {
        
       return self.getComposeList()
    }()
   // let array = getComposeList()
    
    //建立一个按钮数组
    lazy var buttoms = [JSSComposeButton]()
    
   override init(frame: CGRect) {
        super.init(frame: frame)
    
        setupUI()
    }

   required init?(coder aDecoder: NSCoder) {
       fatalError("init(coder:) has not been implemented")
   }

    private func setupUI() {
        
        //设置当前View的frame
        self.frame = UIScreen.mainScreen().bounds
        
        //print("进来->conmposeView")
        
        self.backgroundColor = UIColor.purpleColor()
        
        //把图片变成模糊效果(分类)
        let image = UIImage.getCutImage().applyLightEffect()
        
        let imageView = UIImageView(image:image)
        
        //把上面的imageView添加到当前自定义的View上
        addSubview(imageView)
        
        //把背景标语图片添加到自定义的View上
        addSubview(backImageView)
     
        //测试截图成功
        //let data = UIImagePNGRepresentation(image)
        //data?.writeToFile("/Users/jss/Desktop/截图图片.png", atomically: true)
        
        //标语图片的约束
        backImageView.snp_makeConstraints { (make) -> Void in
            
            make.centerX.equalTo(self)
            make.top.equalTo(150)
        }
        
        //调用下面添加Button的方法
        addListButton()
        
        //测试用的
//        let array = getComposeList()
//        print(array)
        
    }
    
    //添加button
    func addListButton(){
        
        let btnW: CGFloat = 80
        let btnH: CGFloat = 110
        let margin:CGFloat = (SCREENW - 3 * btnW) / 4
        
        //取到模型数组
        let array = getComposeList()
        
        //循环遍历
        for(i,model)in array.enumerate() {
            
            let button = JSSComposeButton()
            
            button.tag = i
            
            button.frame.size = CGSize(width: btnW, height: btnH)
            
            //设置button的相关属性
            button.setTitle(model.title, forState: .Normal)
            
            button.setImage(UIImage(named: model.icon!), forState: .Normal)
            
            button.setTitleColor(UIColor.grayColor(), forState: UIControlState.Normal)
            button.titleLabel?.font = UIFont.systemFontOfSize(15)
            
            //给butn添加点击事件
            button.addTarget(self, action: "didClickBtn:", forControlEvents: UIControlEvents.TouchUpInside)
            
            addSubview(button)
            
            //把按钮添加到数组里
            buttoms.append(button)
            
            //计算列索引
            let colm = i % 3
            //计算行索引
            let row = i / 3
            
            //计算btn的X值
            button.frame.origin.x = CGFloat(colm) * btnW + (CGFloat(colm) + 1) * margin
            
            //计算btn的Y值
            button.frame.origin.y = CGFloat(row) * btnH + CGFloat(row) * margin + SCREENH
  
            
        }
    }
    
    //实现按钮的监听方法
    @objc private func didClickBtn(btn:UIButton) {
        
        UIView.animateWithDuration(0.5, animations: { () -> Void in
            
            //循环Button
            for value in self.buttoms {
                
                //设置alpha值 让btn变透明  然后弹出控制器
                value.alpha = 0.01
                
                //判断当前遍历的是否是点击按钮
                if value == btn {
                    //放大点击按钮
                    value.transform = CGAffineTransformMakeScale(1.3, 1.3)
                    
                }else {
                    //缩小其他按钮
                   value.transform = CGAffineTransformMakeScale(0.1, 0.1)
                }
            }
            
            }) { (_) -> Void in
                
                
             UIView.animateWithDuration(0.5, animations: { () -> Void in
                
                //复原 测试代码
//                //循环Button
//                for value in self.buttoms {
//                    
//                    //设置alpha值 让btn变透明  然后弹出控制器
//                    value.alpha = 1
//                    value.transform = CGAffineTransformIdentity
//                }
            
                //弹出控制器 当前View 不具有弹出控制器的能力需要把这个交给控制器去做
//                let vc = JSSComposeViewController()
                
                //取到模型
     
                let model = self.array[btn.tag]
                
               // print(model)
                
                //检测下面的初始化uiviewcontrol对象是否转换成功
                //let classname = NSStringFromClass(JSSComposeViewController.self)
             
                //print(classname) //WeiBoItem.JSSComposeViewController
                
//                let cla = NSClassFromString("WeiBoItem.JSSComposeViewController")
// 检测上面的类转换成功(所以要把plist里面的className对应的值改掉 不然 下面用模型里面的className初始化类的对象的时候就会报错  上面的注释代码就是为了反推者类转换是否成功v )
                //print(cla)//Optional(WeiBoItem.JSSComposeViewController)
                
                //通过类名初始化对象UIviewController
                let type = NSClassFromString(model.className!) as! UIViewController.Type

                let vc = type.init()
                
               // print(vc) //WeiBoItem.JSSComposeViewController(初始化的对象就和plist里面的classname一样的名字)
                
            self.target?.presentViewController(UINavigationController(rootViewController: vc), animated: true, completion: { () -> Void in
                
                //在弹出控制器后移除 当前View
                self.removeFromSuperview()
                
            })
                
             })
        }
        
    }
    
    //给target赋值 从外界传入控制器(因为只有控制器才能弹出控制器 view不具有弹出控制器的功能)
    func showVC(target:UIViewController?){
        //把当前View 添加到target控制器的View上(本来是在外面tabbar控制器中添加这个View的  现在是把外面的控制器传到View里面来  然后在view里面进行添加自己到外面(传进来的)的控制中)
        target!.view.addSubview(self)
        
        //赋值(把外面传进来的控制器赋给自己的属性target  然后再再进行弹控制器)
        self.target = target
        
    }
    
    deinit{
        
        print("当前composeVeiw被消灭了")
    }
    
    //将要移动到父View上时调用
    override func didMoveToSuperview() {
        
        super.didMoveToSuperview()
        
        //循环执行动画
        for(index,value) in buttoms.enumerate() {
            
            animation(value, Index: index, isUp: true)
            
//            //初始化动画的对象
//            let animate = POPSpringAnimation(propertyNamed:kPOPViewCenter)
//        
//             //kPOPCollectionViewContentOffset 点这个就可以看到上面
//            //指定动画执行的结束位置
//            animate.toValue = NSValue(CGPoint:CGPoint(x: value.center.x, y: value.center.y - 300))
//            //设置动画的一些属性
//            //动画执行的弹力
//            animate.springBounciness = 10
//            //动画执行的速度
//            animate.springSpeed = 10
//            
//            //让动画延迟执行 和下面的方法一样的效果
//            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(Double(index)*0.1 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
//                // 4. 添加动画
//                value.pop_addAnimation(animate, forKey: nil)
//            }

//
//            //添加动画(添加延迟效果)
//            animate.beginTime = Double(index) * 0.1 + CACurrentMediaTime()
//            
//            value.pop_addAnimation(animate, forKey: nil)

        }
        
    }
    
    //点击屏幕 让按钮下去
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        super.touchesBegan(touches, withEvent: event)
        
        //循环按钮数组
        for(index,value)in buttoms.reverse().enumerate() {
            
            animation(value, Index: index, isUp: false)
            
            //执行完动画以后把整个VIew从父View上移除
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(0.4 * Double(NSEC_PER_SEC))), dispatch_get_main_queue()) { () -> Void in
                self.removeFromSuperview()
            }
            
//            //初始化动画对象
//            let animate = POPSpringAnimation(propertyNamed:kPOPViewCenter)
//
//            //动画执行结束的位置
//            animate.toValue = NSValue(CGPoint: CGPoint(x: value.center.x, y: value.center.y + 300))
//            //设置动画属性
//            animate.springSpeed = 10
//            animate.springBounciness = 10
//            
//            //让动画延迟动画
//            animate.beginTime = Double(index) * 0.1 + CACurrentMediaTime()
//            //添加动画
//            value.pop_addAnimation(animate, forKey: nil)
            
            
        }
        
    }
    
    //抽取上面遍历数组后执行的动画方法
    private func animation(value:UIView,Index:Int,isUp:Bool){
        
        //初始化动画对象
        let animate = POPSpringAnimation(propertyNamed:kPOPViewCenter)
        
        //动画执行结束的位置
        animate.toValue = NSValue(CGPoint: CGPoint(x: value.center.x, y: value.center.y + (isUp ? -300 : 300)))
        //设置动画属性
        animate.springSpeed = 10
        animate.springBounciness = 10
        
        //让动画延迟动画
        animate.beginTime = Double(Index) * 0.1 + CACurrentMediaTime()
        //添加动画
        value.pop_addAnimation(animate, forKey: nil)
        
    }
    
    
    //从plist中获取数据
    func getComposeList()->[JSSComposeListModel] {
        
        //获取文件路径
        let path = NSBundle.mainBundle().pathForResource("compose.plist", ofType: nil)!
        
        //读取文件到数组
       let array = NSArray(contentsOfFile:path)!
        //创建一个空数组
        var mArray = [JSSComposeListModel]()
        //遍历数组 字典转模型
        for value in array {
            
            //字典转模型
            let model = JSSComposeListModel(dict: value as! [String:AnyObject])
            
            mArray.append(model)
        }
        
        return mArray
    }
    
    
    //截图(已经抽取到了分类里面)
//    func getCutImage()->UIImage {
//        
//        //取到主窗口
//        let window = UIApplication.sharedApplication().keyWindow
//        
//        //取到主窗口的frame
//        let rect = window?.frame
//        //开启图形上下文(最后面的参数 0是要接下来的图按原比例显示(按点)比较清楚 1是按像素(模糊)显示 )
//        UIGraphicsBeginImageContextWithOptions((rect?.size)!, false, 0)
//        //把图片渲染到图像上下文中
//        window?.drawViewHierarchyInRect(rect!, afterScreenUpdates: true)
//        //获取图片
//        let image = UIGraphicsGetImageFromCurrentImageContext()
//        //关闭图形上下文
//        UIGraphicsEndImageContext()
//        //返回图片
//        return image
// 
//    }
    
    
    private lazy var backImageView:UIImageView = UIImageView(image: UIImage(named: "compose_slogan"))
    
}
